# 从 flask 模块导入 request 对象
# EN: Import the request object from the flask module
from flask import request


# 定义一个函数 view_cache_key，用于生成视图缓存的键
# EN: Define a function view_cache_key to generate a cache key for the view
def view_cache_key(*unused_args, **unused_kwargs) -> str:
    """
    生成视图缓存的键。
    EN: Generate a cache key for the view.

    Returns:
        str: 缓存键
        EN: str: The cache key
    """
    # 计算请求参数的哈希值
    # EN: Calculate the hash of the request arguments
    args_hash = hash(frozenset(request.args.items()))
    # 返回格式化的缓存键
    # EN: Return the formatted cache key
    return f'view/{request.path}/{args_hash}'


# 定义一个装饰器 memoized_func，用于缓存函数结果
# EN: Define a decorator memoized_func to cache function results
def memoized_func(key=view_cache_key, attribute_in_key=None):
    """
    使用此装饰器可以缓存具有预定义第一个参数的函数。
    EN: Use this decorator to cache functions that have a predefined first argument.

    默认情况下，enable_cache 被视为 True，
    除非将 enable_cache = False 传递给修饰的函数。
    EN: enable_cache is treated as True by default,
    except when enable_cache = False is passed to the decorated function.

    force 表示是否强制刷新缓存，默认为 False，
    除非将 force = True 传递给修饰的函数。
    EN: force means whether to force refresh the cache and is treated as False by default,
    except when force = True is passed to the decorated function.

    缓存的超时时间默认为 600 秒，
    除非将 cache_timeout = {以秒为单位的超时时间} 传递给修饰的函数。
    EN: The timeout of the cache is set to 600 seconds by default,
    except when cache_timeout = {timeout in seconds} is passed to the decorated function.

    memoized_func 使用 simple_cache 并将数据存储在内存中。
    EN: memoized_func uses simple_cache and stores the data in memory.
    Key 是一个可调用函数，它接受函数参数并返回缓存键。
    EN: Key is a callable function that takes function arguments and returns the caching key.
    """

    # 定义一个包装器函数 wrap
    # EN: Define a wrapper function wrap
    def wrap(f):
        # noop (无操作)
        # EN: noop (no operation)
        # 定义一个内部包装函数 wrapped_f
        # EN: Define an inner wrapper function wrapped_f
        def wrapped_f(self, *args, **kwargs):
            # 直接调用原始函数并返回结果
            # EN: Directly call the original function and return the result
            return f(self, *args, **kwargs)

        # 返回内部包装函数
        # EN: Return the inner wrapper function
        return wrapped_f

    # 返回包装器函数
    # EN: Return the wrapper function
    return wrap
